package com.example.demo.consumer;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.example.demo.api.HelloService;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 许路路
 */
public class ApiConfigConsumerMain {

    public static void main(String[] args) {
        //consumer();
        p2p();
    }

    public static void consumer() {
// 当前应用配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("hello-demo-consumer");

        // 连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setProtocol("zookeeper");
        registry.setAddress("127.0.0.1:2181");
        //registry.setUsername("aaa");
        //registry.setPassword("bbb");

        // 注意：ReferenceConfig为重对象，内部封装了与注册中心的连接，以及与服务提供方的连接

        // 方法级配置
        List<MethodConfig> methods = new ArrayList<MethodConfig>();
        MethodConfig method = new MethodConfig();
        method.setName("syaHello");
        method.setTimeout(10000);
        method.setRetries(0);
        methods.add(method);

        // 引用远程服务
        ReferenceConfig<HelloService> reference = new ReferenceConfig<HelloService>(); // 此实例很重，封装了与注册中心的连接以及与提供者的连接，请自行缓存，否则可能造成内存和连接泄漏
        reference.setApplication(application);
        reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
        reference.setInterface(HelloService.class);
        reference.setVersion("1.0.0");
        // 设置方法级配置
        reference.setMethods(methods);
        // 和本地bean一样使用xxxService
        HelloService xxxService = reference.get(); // 注意：此代理对象内部封装了所有通讯细节，对象较重，请缓存复用
        String hello = xxxService.getName("demo");
        System.out.println(hello);
    }

    /**
     * 点对点直连
     */
    public static void p2p() {
        ApplicationConfig application = new ApplicationConfig();
        application.setName("hello-demo-consumer");
        ReferenceConfig<HelloService> reference = new ReferenceConfig<HelloService>(); // 此实例很重，封装了与注册中心的连接以及与提供者的连接，请自行缓存，否则可能造成内存和连接泄漏
        // 如果点对点直连，可以用reference.setUrl()指定目标地址，设置url后将绕过注册中心，
        // 其中，协议对应provider.setProtocol()的值，端口对应provider.setPort()的值，
        // 路径对应service.setPath()的值，如果未设置path，缺省path为接口名
        reference.setUrl("dubbo://127.0.0.1:20880/com.example.demo.api.HelloService");
        reference.setApplication(application);
        reference.setVersion("1.0.0");
        reference.setInterface(HelloService.class);
        HelloService xxxService = reference.get();
        String hello = xxxService.getName("demo");
        System.out.println(hello);
    }

}
